# 【一】引入
# 我们通过selenium访问到某个页面的时候因为你网络原因所以你会看到你的网页转圈圈(正在加载)
# 在html加载的时候我们给selenium加一个等待的时间
# 等待到我们想要的内容出现就立即执行代码或者超出等待时间抛出异常

# 【二】页面等待的三种方案
# 【1】强制等待
# time.sleep()
# 不管页面刷新还是不刷新都会一直等待

# 【2】显示等待
# ● 也称为智能等待，针对指定元素定位指定等待时间
# ● 在指定时间范围内进行元素查找，找到元素则直接返回
# ● 如果在超时还没有找到元素，则抛出异常
# ● 显示等待是 selenium 当中比较灵活的一种等待方式，他的实现原理其实是通过 while 循环不停的尝试需要进行的操作。
"""
from selenium.webdriver.support.ui import WebDriverWait

'''
driver: 浏览器对象,
timeout: 总的等待时间,
poll_frequency: 每一次的检查间隔时间
'''
wait = WebDriverWait()

# 参数直接放 你需要等待出现的那个标签对象
from selenium.webdriver.support import expected_conditions as ES
wait.until(ES.presence_of_all_elements_located((By.Xpath,"元素path表达式")))
"""

# 【3】隐式等待
# ● 隐式等待设置之后代码中的所有元素定位都会做隐式等待
# ● 通过implicitly Wait完成的延时等待，注意这种是针对全局设置的等待
# ● 如设置超时时间为10秒，使用了implicitlyWait后
# ● 如果第一次没有找到元素，会在10秒之内不断循环去找元素
# ● 如果超过10秒还没有找到，则抛出异常
# ● 隐式等待比较智能，它可以通过全局配置，但是只能用于元素定位
'''
from selenium.webdriver import Chrome

browser = Chrome()

# 给全局的浏览器设置一个等待时间
browser.implicitly_wait(5)

# 所以这个等待时间针对于 所有的 标签对象
'''

# 【三】显示等待和隐式等待的区别
# 【1】显示等待
# 针对于某一个标签对象来说的 只有当前标签对象出现就不需要等待 或者是你通过人手触发
# 【2】隐式等待
# 针对于全局浏览器中的所有标签对象来说的 必须每一个标签都等待
